package br.com.virtual.base.controller.autenticacao;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.virtual.base.controller.util.VirtualMB;
import br.com.virtual.base.exceptions.VirtualValidationException;
import br.com.virtual.base.service.SenderEmail;
import br.com.virtual.base.validator.EmailValidator;
import br.com.virtual.cadastrar.model.Pessoa;
import br.com.virtual.cadastrar.model.Usuario;
import br.com.virtual.cadastrar.service.PessoaService;
import br.com.virtual.cadastrar.service.UsuarioService;

@ManagedBean
@ViewScoped
public class RecuperarSenhaMB extends VirtualMB {

	private static final long serialVersionUID = 1L;
	private String email;
	private String novaSenha;
	private Long idRequest;
	private String emailRequest;

	@EJB
	private PessoaService pessoaService;

	@EJB
	private UsuarioService usuarioService;

	@EJB
	private SenderEmail senderEmail;

	@PostConstruct
	private void init() {

		try {
			idRequest = Long.valueOf(FacesContext.getCurrentInstance()
					.getExternalContext().getRequestParameterMap().get("id"));
		} catch (NumberFormatException n) {
			idRequest = null;
		}

		emailRequest = FacesContext.getCurrentInstance().getExternalContext()
				.getRequestParameterMap().get("email");

	}

	public void recuperarSenha() {

		Pessoa pessoa = this.pessoaService.findByEmail(email);

		if (pessoa == null) {
			this.addFacesMessage(
					"O E-mail informado está incorreto! Tente novamente.",
					FacesMessage.SEVERITY_ERROR, null);
		} else {

			EmailValidator ev = new EmailValidator();
			if (ev.validaEmail(pessoa.getEmail())) {

				int posArroba = pessoa.getEmail().lastIndexOf('@');
				String email = pessoa.getEmail().substring(0, 3) + "..."
						+ pessoa.getEmail().substring(posArroba);

				this.senderEmail.sendEmailRecuperarSenha(pessoa);

				this.addFacesMessage("Foi enviado para o e-mail " + email
						+ " um link para alteração de senha.",
						FacesMessage.SEVERITY_INFO, null);

				this.redirectToLoginPage();
			} else {

				this.addFacesMessage("Email cadastrado inválido",
						FacesMessage.SEVERITY_INFO, null);
			}
		}

	}

	public void salvarNovaSenha() {

		if (idRequest != null && emailRequest != null
				&& !emailRequest.isEmpty() && this.novaSenha != null
				&& !this.novaSenha.isEmpty()) {

			Pessoa pessoa = this.pessoaService.read(idRequest);

			if (pessoa != null && pessoa.getEmail().equals(emailRequest)) {

				try {

					Usuario usuario = pessoa.getUsuario();
					usuario.setSenha(novaSenha);

					this.usuarioService.update(usuario);

					this.addFacesMessage("Senha alterada com sucesso!",
							FacesMessage.SEVERITY_INFO, null);
				} catch (VirtualValidationException e) {
					this.addFacesMessage("Erro ao alterar senha",
							FacesMessage.SEVERITY_ERROR, null);
					this.redirectToLoginPage();
				}
			}
		} else {

			this.addFacesMessage(
					"Ocorreu um erro ao tentar alterar senha, caso queira clique no link esqueceu sua senha e solicite uma nova senha.",
					FacesMessage.SEVERITY_ERROR, null);
		}

		this.redirectToLoginPage();
	}

	/*
	 * getters and setters
	 */
	public String getCpf() {
		return email;
	}

	public void setCpf(String cpf) {
		this.email = cpf;
	}

	public String getNovaSenha() {
		return novaSenha;
	}

	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}

}
